package Silnik;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

/**
 * Klasa odczytująca kursy walut z dokumentu XML
 * @author Jakub Banaszewski
 */
class KursDnia
{

   /**
    * Pozycja w dokumencie XML
    */
   private class Pozycja
   {

      private final String nazwaKraju;
      private final String kodWaluty;
      private final int przelicznik;
      private final double kurs;

      public Pozycja(String nazwaKraju, String kodWaluty, int przelicznik, double kurs)
      {
         this.nazwaKraju = nazwaKraju;
         this.kodWaluty = kodWaluty;
         this.przelicznik = przelicznik;
         this.kurs = kurs;
      }

      public String getKodWaluty()
      {
         return kodWaluty;
      }

      public double getKurs()
      {
         return kurs;
      }

      public String getNazwaKraju()
      {
         return nazwaKraju;
      }

      public int getPrzelicznik()
      {
         return przelicznik;
      }

      @Override
      public String toString()
      {
         return "Pozycja{" + "nazwaKraju=" + nazwaKraju + ", kodWaluty=" + kodWaluty
                + ", przelicznik=" + przelicznik + ", kurs=" + kurs + ", symbolWaluty="
                + '}';
      }
   }
   
   private final HashMap<String, Pozycja> skrótWaluta;

   protected HashMap<String, String> getSkróty()
   {
      HashMap<String,String> wynik = new HashMap<>();
      for (Map.Entry<String, Pozycja> entry : skrótWaluta.entrySet())
      {
         String string = entry.getKey();
         Pozycja pozycja = entry.getValue();
         wynik.put(string, pozycja.getNazwaKraju());
      }
      return wynik;
   }
   
   /**
    * Konstruktor odczytujący plik XML i zapisujący kurs pojedynczych walut.
    * @param address Adres pliku
    */
   public KursDnia(String address) throws Exception
   {
      if (address == null)
      {
         throw new Exception("Błędny adres pliku XML");
      }
      skrótWaluta = new HashMap<>();
      try
      {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document doc = db.parse(address);
         doc.getDocumentElement().normalize();
         NodeList nodeLst = doc.getElementsByTagName("pozycja");

         for (int i = 0; i < nodeLst.getLength(); i++)
         {
            Node węzeł = nodeLst.item(i);
            if (węzeł.getNodeType() == Node.ELEMENT_NODE)
            {
               Element pozycja = (Element) węzeł;
               Element element = (Element) pozycja.getElementsByTagName("nazwa_kraju").item(0);
               if (element == null)
                  element = (Element) pozycja.getElementsByTagName("nazwa_waluty").item(0);
               String nazwaKraju = element.getChildNodes().item(0).getNodeValue();
               element = (Element) pozycja.getElementsByTagName("przelicznik").item(0);
               int przelicznik = Integer.parseInt(element.getChildNodes().item(0).getNodeValue());
               element = (Element) pozycja.getElementsByTagName("kod_waluty").item(0);
               String kodWaluty = element.getChildNodes().item(0).getNodeValue();
               element = (Element) pozycja.getElementsByTagName("kurs_sredni").item(0);
               double kurs = Double.parseDouble(element.getChildNodes().item(0).getNodeValue().replace(",", "."));
               Pozycja dane = new Pozycja(nazwaKraju, kodWaluty, przelicznik, kurs);
               skrótWaluta.put(kodWaluty, dane);
            }
         }

      } catch (SAXException | IOException | ParserConfigurationException ex)
      {
         Logger.getLogger(KursDnia.class.getName()).log(Level.SEVERE, null, ex);
      }

   }

   /**
    * Odczytanie kursu waluty
    * @param waluta Skrót walury
    * @return Kurs waluty
    */
   public double getValue(String waluta)
   {
      return skrótWaluta.get(waluta).getKurs();
   }
   
   /**
    * Odczytanie przelicznika waluty
    * @param waluta Skrót walury
    * @return Przelicznik kursu
    */
   public int getPrzelicznik(String waluta)
   {
      return skrótWaluta.get(waluta).getPrzelicznik();
   }
}
